/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;
import aentity.aePuntoUbicacion;
import alogic.alAlgMetaHeu;
import bentity.beCoordenada;
import bentity.beEntrada;
import bentity.bePallet;
import bentity.beProducto;
import bentity.beUbicacion;
import blogic.blOrdenDespacho;
import blogic.blPallet;
import blogic.blUbicacion;
import com.itextpdf.text.pdf.codec.wmf.Point;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author cesar
 */
public class daoUbicacion {
    public static final int E_RESERVADO = 37;
    public static final int E_OCUPADO = 14;
    public static final int E_ROTADO =33;
    public static final String OCUPADO = "Ocupado";
    public static final String RESERVADO = "Reservado";
    public int tipoProducto =-1;
    beEntrada entrada = null;

    public int registrarUbi(int idUbi, int idPallet, Date fecha,int estado) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "INSERT INTO UBICACION_X_PALLET (ID_UBICACION,ID_PALLET,FECHAUBICACION,ESTADOUBICACION) VALUES (?,?,CURRENT_TIMESTAMP,?)";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idUbi);
        ps.setInt(2, idPallet);
        ps.setInt(3, estado);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int actualizarUbi(int idUbi, int idPallet,int estado,String motivo) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "UPDATE UBICACION_X_PALLET SET ESTADOUBICACION = ?, MOTIVO = ?,FECHASALIDA = CURRENT_TIMESTAMP WHERE ID_UBICACION = ? AND ID_PALLET = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, estado);
        ps.setString(2,motivo);
        ps.setInt(3, idUbi);
        ps.setInt(4,idPallet);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;


    }
     public int eliminarUbi(int idUbi, int idPallet) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "DELETE FROM UBICACION_X_PALLET WHERE ID_UBICACION = ? AND ID_PALLET = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idUbi);
        ps.setInt(2,idPallet);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;


    }  

    public ArrayList<String> getTipoEstado() throws SQLException{
        ArrayList<String> estados = new ArrayList<String>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT NOMBRE_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'EUBICA'";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        rs = ps.executeQuery();
        while (rs.next()){
            String nombre_dato = "";
            nombre_dato = rs.getString(1);
            estados.add(nombre_dato);


        }
        rs.close();
        ps.close();
        conn.close();

        return estados;

    }
     public ArrayList<Integer> getTipoEstadoInt() throws SQLException{
            ArrayList<Integer> estados = new ArrayList<Integer>();
            Connection conn = null;
            PreparedStatement ps = null;
            ResultSet rs = null;
            String sql = "SELECT ID_DATO FROM DATOS_COMBO WHERE NOMBRE_COMBO = 'EUBICA'";
            conn = daoHelper.dameConexion();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while (rs.next()){
                int nombre_dato = 0;
                nombre_dato = rs.getInt(1);
                estados.add(nombre_dato);
            }
            rs.close();
            ps.close();
            conn.close();

            return estados;

        }
    public ArrayList<Integer> getPosicion_X_Y(int idUbicacion) throws SQLException{
        
        ArrayList<Integer> posiciones = new ArrayList<Integer>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT POSICION_X, POSICION_Y FROM UBICACION WHERE ID_UBICACION =?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idUbicacion);
        rs = ps.executeQuery();
        rs.next();
        int x = rs.getInt(1);
        int y = rs.getInt(2);
        posiciones.add(x);
        posiciones.add(y);

        rs.close();
        ps.close();
        conn.close();
        return posiciones;

    }

    public ArrayList<beUbicacion> obtenerUbicacion(int estado) throws SQLException{
        ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT ID_UBICACION FROM UBICACION_X_PALLET WHERE ESTADOUBICACION =?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, estado);
        rs = ps.executeQuery();
        int id;
        while (rs.next()){
            id = rs.getInt(1);
            ids.add(id);
        }
        for ( int i = 0;i < ids.size();i++){
            sql = "SELECT U.*,R.ID_TIPO_PRODUCTO FROM UBICACION U, RACK R WHERE U.ID_UBICACION = ? AND U.ID_RACK = R.ID_RACK";
            ps = conn.prepareStatement(sql);
            ps.setInt(1, ids.get(i));
            rs = ps.executeQuery();
            rs.next();
            beUbicacion ubicacion = new beUbicacion(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(6));
            ubicacion.setTipo_pallet(rs.getInt(8));
            ubicacion.setTipoProd(rs.getInt(9));
            ubicaciones.add(ubicacion);

        }
        rs.close();
        ps.close();
        conn.close();
        return ubicaciones;
    }

     public ArrayList<beUbicacion> obtenerUbicacionDisponible(ArrayList<beUbicacion> ubiOcupadas,ArrayList<beUbicacion> ubiReservadas) throws SQLException{
         ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
         ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
       
         for(int i=0;i < ubiOcupadas.size();i++){
           ubiPallet.add(ubiOcupadas.get(i));
         }
   

         for(int i=0;i < ubiReservadas.size();i++){

           ubiPallet.add(ubiReservadas.get(i));
         }


          String sql = null;
  
          
           sql = "SELECT * FROM UBICACION WHERE DESBLOQUEADO = 't' ";
           

           conn = daoHelper.dameConexion();
         

        
           for(int i=0;i < ubiPallet.size();i++){
             
               sql += " AND ID_UBICACION <> ?";
             
           }
           ps = conn.prepareStatement(sql);
             for(int i=1;i <= ubiPallet.size();i++){
                 ps.setInt(i,ubiPallet.get(i-1).getId_ubicacion());

           }



           rs = ps.executeQuery();
           while(rs.next()){;
        
             beUbicacion ubicacion = new beUbicacion(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(6));

             ubiDisp.add(ubicacion);
           }
  

         rs.close();
         ps.close();
         conn.close();

         return ubiDisp;

    }

     public ArrayList<beUbicacion> obtenerUbicacionBloq(ArrayList<beUbicacion> ubiOcupadas, ArrayList<beUbicacion> ubiReservadas) throws SQLException{
         ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
         ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;

         for(int i=0;i < ubiOcupadas.size();i++){
            ubiPallet.add(ubiOcupadas.get(i));
         }



         for(int i=0;i < ubiReservadas.size();i++){

           ubiPallet.add(ubiReservadas.get(i));
         }

          String sql = null;


           sql = "SELECT * FROM UBICACION WHERE DESBLOQUEADO = 'f' ";


           conn = daoHelper.dameConexion();



           for(int i=0;i < ubiPallet.size();i++){

               sql += " AND ID_UBICACION <> ?";

           }
           ps = conn.prepareStatement(sql);
             for(int i=1;i <= ubiPallet.size();i++){
                 ps.setInt(i,ubiPallet.get(i-1).getId_ubicacion());

           }

           rs = ps.executeQuery();
           while(rs.next()){;
             
             beUbicacion ubicacion = new beUbicacion(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(6));

             ubiDisp.add(ubicacion);
           }


         rs.close();
         ps.close();
         conn.close();

         return ubiDisp;

    }

     public int bloquear(int id,int estado) throws SQLException{
         Connection conn = null;
        PreparedStatement ps = null;
        String sql ="UPDATE UBICACION SET DESBLOQUEADO = ? WHERE ID_UBICACION = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);;
        ps.setBoolean(1,false);
        ps.setInt(2,id);

        ps.executeUpdate();

        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
     }

     public int desbloquear(int id,int estado) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql ="UPDATE UBICACION SET DESBLOQUEADO = ? WHERE ID_UBICACION = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);;
        ps.setBoolean(1,true);
        ps.setInt(2,id);

        ps.executeUpdate();

        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
     }

     public boolean estaDesbloqueado(int id) throws Exception{
        boolean est=true;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql ="SELECT UB.DESBLOQUEADO FROM UBICACION UB WHERE UB.ID_UBICACION=?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1,id);

        rs=ps.executeQuery();
        while(rs.next()){
             est = rs.getBoolean(1);
        }
        ps.close();
        conn.close();
        return est;

     }

     public beUbicacion dameUbicacionSegunCoordenadas(int x,int y,int piso) throws Exception{
        beUbicacion ubicacion = new beUbicacion();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql ="SELECT UB.*,RK.* FROM UBICACION UB, RACK RK WHERE UB.POSICION_X=? AND UB.POSICION_Y=? AND UB.NUMERO_PISO=? AND RK.ID_RACK=UB.ID_RACK";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1,x);
        ps.setInt(2,y);
        ps.setInt(3,piso);

        rs=ps.executeQuery();
        while(rs.next()){
           beCoordenada coordenada = new beCoordenada();
           ubicacion = new beUbicacion();
           coordenada.setPiso(rs.getInt(2));
           coordenada.setUbicacion(rs.getInt(3));
           coordenada.setxEnMapa(rs.getInt(4));
           coordenada.setyEnMapa(rs.getInt(5));
           coordenada.setFila(rs.getInt(16));
           coordenada.setRack(rs.getInt(17));
           ubicacion.setId_ubicacion(rs.getInt(1));
           ubicacion.setId_rack(rs.getInt(6));
           ubicacion.setDesbloqueado(rs.getBoolean(7));
           ubicacion.setTipo_pallet(rs.getInt(8));
           ubicacion.setCoordenadas(coordenada);

        }
        ps.close();
        conn.close();
        return ubicacion;

     }

     public boolean estaDesbloqueado(int x,int y,int piso) throws Exception{
        boolean est=true;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql ="SELECT UB.DESBLOQUEADO FROM UBICACION UB WHERE UB.POSICION_X=? AND UB.POSICION_Y=? AND UB.NUMERO_PISO=?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1,x);
        ps.setInt(2,y);
        ps.setInt(3,piso);

        rs=ps.executeQuery();
        while(rs.next()){
             est = rs.getBoolean(1);
        }
        ps.close();
        conn.close();
        return est;

     }

     public boolean validarTabla(int estado) throws SQLException{

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION_X_PALLET WHERE ESTADOUBICACION = ? ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int cont =-1;
        ps.setInt(1, estado);
        rs=ps.executeQuery();
        rs.next();
        cont = rs.getInt(1);
        rs.close();
         ps.close();
         conn.close();
        return (cont > 0);
     }

     public boolean validarUbiDisp() throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION WHERE DESBLOQUEADO = 't' OR DESBLOQUEADO IS NULL ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int cont =-1;
        rs=ps.executeQuery();
        rs.next();
        cont = rs.getInt(1);
        rs.close();
         ps.close();
         conn.close();
        return (cont > 0);
    }

     public boolean validarUbiDispBloq() throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION WHERE DESBLOQUEADO = 't' OR DESBLOQUEADO IS NULL OR DESBLOQUEADO = 'f'";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int cont =-1;
        rs=ps.executeQuery();
        rs.next();
        cont = rs.getInt(1);
        rs.close();
         ps.close();
         conn.close();
        return (cont > 0);

     }

public ArrayList<beUbicacion> obtenerUbiXProd(int idProducto) throws SQLException{

       ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
       ArrayList<Integer> estados = new ArrayList<Integer>();
       estados = getTipoEstadoInt();
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       String sql = "SELECT U.*, R.*, PD.NOMBRE, P.ID_PALLET FROM UBICACION U, UBICACION_X_PALLET UP, PRODUCTO PD, PALLET P, RACK R WHERE U.ID_UBICACION = UP.ID_UBICACION AND PD.ID_PRODUCTO = P.ID_PRODUCTO AND UP.ID_PALLET = P.ID_PALLET AND R.ID_RACK = U.ID_RACK AND UP.ESTADOUBICACION = ? AND PD.ID_PRODUCTO = ?";
       conn = daoHelper.dameConexion();
       ps = conn.prepareStatement(sql);
       ps.setInt(1, estados.get(0));
       ps.setInt(2,idProducto);
       rs = ps.executeQuery();
       while (rs.next()){
           beCoordenada coordenada = new beCoordenada();
           beUbicacion ubicacion = new beUbicacion();
           coordenada.setFila(rs.getInt(16));
           coordenada.setRack(rs.getInt(17));
           coordenada.setPiso(rs.getInt(2));
           coordenada.setUbicacion(rs.getInt(3));
           coordenada.setxEnMapa(rs.getInt(4));
           coordenada.setyEnMapa(rs.getInt(5));
           ubicacion.setId_ubicacion(rs.getInt(1));
           ubicacion.setId_rack(rs.getInt(6));
           ubicacion.setCoordenadas(coordenada);
           ubicacion.setIdProducto(idProducto);
           ubicacion.setNombProducto(rs.getString(19));
           ubicacion.setIdPallet(rs.getInt(20));
           ubicaciones.add(ubicacion);
       }
       rs.close();
       ps.close();
       conn.close();
       return ubicaciones;

}

    

public ArrayList<beUbicacion> dameUbicacionesPosibles(int idTipoProducto, int tipoPallet) throws Exception{
    
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    ArrayList<Integer> estados = new ArrayList<Integer> ();
    estados = getTipoEstadoInt();
    ArrayList<beUbicacion> ubiOcupadas = obtenerUbicacion(estados.get(0));
    ArrayList<beUbicacion> ubiReservadas = obtenerUbicacion(estados.get(4));
    ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
    ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();

         for(int i=0;i < ubiOcupadas.size();i++){
           ubiPallet.add(ubiOcupadas.get(i));
         }


         for(int i=0;i < ubiReservadas.size();i++){
           ubiPallet.add(ubiReservadas.get(i));
         }

         String sql = null;

         sql = "SELECT DISTINCT U.*,R.* FROM UBICACION U, RACK R WHERE U.DESBLOQUEADO = 't' AND U.TIPO_PALLET = ? AND R.ID_TIPO_PRODUCTO = ? AND R.ID_RACK = U.ID_RACK";



           for(int i=0;i < ubiPallet.size();i++){

               sql += " AND U.ID_UBICACION <> ?";

           }

           conn = daoHelper.dameConexion();
           ps = conn.prepareStatement(sql);
           ps.setInt(1,tipoPallet);
           ps.setInt(2, idTipoProducto);

             for(int i=3;i <= ubiPallet.size()+2;i++){
                 ps.setInt(i,ubiPallet.get(i-3).getId_ubicacion());

           }

 

    rs=ps.executeQuery();
    
    while(rs.next()){
        beCoordenada coordenada = new beCoordenada();
        beUbicacion ubicacion = new beUbicacion();
        coordenada.setFila(rs.getInt(16));
        coordenada.setRack(rs.getInt(17));
        coordenada.setPiso(rs.getInt(2));
        coordenada.setUbicacion(rs.getInt(3));
        coordenada.setxEnMapa(rs.getInt(4));
        coordenada.setyEnMapa(rs.getInt(5));
        ubicacion.setId_ubicacion(rs.getInt(1));
        ubicacion.setId_rack(rs.getInt(6));
        ubicacion.setCoordenadas(coordenada);
        ubicacion.setTipo_pallet(rs.getInt(8));
        ubicacion.setDesbloqueado(rs.getBoolean(7));
        ubiDisp.add(ubicacion);
    }
    rs.close();
    ps.close();
    conn.close();
    return ubiDisp;
}

public ArrayList<beUbicacion> obtenerUbicaciones(String strFila,String strRack,String strPiso,String strUbi) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql =null;
        beUbicacion ubicacion = new beUbicacion();
        int []contador = new int[5];
        int Fila = -1;
        int Rack = -1;
        int Piso = -1;
        int Ubi = -1;

        sql = "SELECT UP.id_Ubicacion,U.numero_Piso,U.numero_Ubicacion,R.numero_Fila,R.numero_Rack "
                + "FROM UBICACION U, RACK R, UBICACION_X_PALLET UP WHERE U.ID_RACK = R.ID_RACK AND UP.ID_UBICACION = U.ID_UBICACION";

        sql += " AND UP.ESTADOUBICACION = ?";

        contador[0] = 1;
        if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[1] = 1;
        }

        if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[2] = 1;
        }

        if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[3] = 1;
        }

         if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[4] = 1;
        }


        sql += " ORDER BY ID_UBICACION ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<5; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setInt(j,beUbicacion.U_ACTIVO);
                        break;

                    case 1:
                        ps.setInt(j,Fila);
                        break;

                    case 2:
                        ps.setInt(j,Rack);
                        break;

                    case 3:
                        ps.setInt(j,Piso);
                        break;

                    case 4:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }

        rs= ps.executeQuery();
        ArrayList<beUbicacion> listaUbicaciones = new ArrayList<beUbicacion>();

        beCoordenada  c = new beCoordenada();
        blUbicacion bu = new blUbicacion();
        blPallet bp = new blPallet();
        bePallet p  = new bePallet();
        while (rs.next()){

            c.setFila(rs.getInt(4));
            c.setPiso(rs.getInt(2));
            c.setRack(rs.getInt(5));
            c.setUbicacion(rs.getInt(3));
            ubicacion.setCoordenadas(c);
            ubicacion.setId_ubicacion(rs.getInt(1));

            listaUbicaciones.add(ubicacion);
        }
        rs.close();
        ps.close();
        conn.close();
       return listaUbicaciones;
    }

public ArrayList<beUbicacion> obtenerUbicaciones_CargaMasiva(String strFila,String strRack,String strPiso,String strUbi) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql =null;
        beUbicacion ubicacion = new beUbicacion();
        int []contador = new int[4];
        int Fila = -1;
        int Rack = -1;
        int Piso = -1;
        int Ubi = -1;

        sql = "SELECT U.id_Ubicacion,U.numero_Piso,U.numero_Ubicacion,R.numero_Fila,R.numero_Rack "
                + "FROM UBICACION U, RACK R WHERE U.ID_RACK = R.ID_RACK ";
//
//        sql += " AND UP.ESTADOUBICACION = ?";
//
//        contador[0] = 1;
        if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[0] = 1;
        }

        if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[1] = 1;
        }

        if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[2] = 1;
        }

         if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[3] = 1;
        }


        sql += " ORDER BY ID_UBICACION ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        ps.setInt(j,Fila);
                        break;

                    case 1:
                        ps.setInt(j,Rack);
                        break;

                    case 2:
                        ps.setInt(j,Piso);
                        break;

                    case 3:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }

        rs= ps.executeQuery();
        ArrayList<beUbicacion> listaUbicaciones = new ArrayList<beUbicacion>();

        beCoordenada  c = new beCoordenada();
        blUbicacion bu = new blUbicacion();
        blPallet bp = new blPallet();
        bePallet p  = new bePallet();
        while (rs.next()){

            c.setFila(rs.getInt(4));
            c.setPiso(rs.getInt(2));
            c.setRack(rs.getInt(5));
            c.setUbicacion(rs.getInt(3));
            ubicacion.setCoordenadas(c);
            ubicacion.setId_ubicacion(rs.getInt(1));

            listaUbicaciones.add(ubicacion);
        }
        rs.close();
        ps.close();
        conn.close();
       return listaUbicaciones;
    }

 public boolean estaBloqueado(int id) throws SQLException{
     Connection conn = null;
     PreparedStatement ps = null;
     ResultSet rs = null;
     int cont = -1;
     String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION WHERE DESBLOQUEADO = 'f' AND ID_UBICACION = ?";
     conn = daoHelper.dameConexion();
     ps = conn.prepareStatement(sql);
     ps.setInt(1, id);
     rs = ps.executeQuery();
     rs.next();
     cont = rs.getInt(1);
     return cont > 0 ;
 }

 public boolean estaOcupada(int id) throws SQLException{

     Connection conn = null;
     PreparedStatement ps = null;
     ResultSet rs = null;
     int cont = -1;
     String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION_X_PALLET WHERE ID_UBICACION = ? ";
     conn = daoHelper.dameConexion();
     ps = conn.prepareStatement(sql);
     ps.setInt(1, id);
     rs = ps.executeQuery();
     rs.next();
     cont = rs.getInt(1);
     return cont > 0 ;

 }

    public int registrarUbiHoy(ArrayList<bePallet> arrPallets) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        bePallet pallet;
        String sql = "INSERT INTO UBICACION_X_PALLET (ID_UBICACION,ID_PALLET,FECHAUBICACION,MOTIVO,ESTADOUBICACION) VALUES (?,?,CURRENT_TIMESTAMP,?,?)";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);

        for(int i=0;i<arrPallets.size();i++){
            pallet=new bePallet();
            pallet=arrPallets.get(i);
            ps.setInt(1, pallet.getUbicacion().getIdUbicacion());
            ps.setInt(2, pallet.getId_Pallet());
            ps.setString(3,"Ingreso de pallet"); //Debe especificarse el código de ingreso (id_ingreso)
            ps.setInt(4, this.getTipoEstadoInt().get(0));
            ps.executeUpdate();
            //bien=(new blProducto().actualizarStock(arrPallets.get(i).getId_Pallet(),arrPallets.get(i).);
        }
        
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int actualizarUbiXDespacho(int idDespacho,int estado,String motivo) throws SQLException{

        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "UPDATE UBICACION_X_PALLET SET ESTADOUBICACION = ?, MOTIVO = ?, FECHASALIDA = CURRENT_TIMESTAMP WHERE ID_ORDEN_DESPACHO = ? ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, estado);
        ps.setString(2,motivo);
        ps.setInt(3, idDespacho);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;

    }

    public int reservarUbicaciones(int idOrdenDespacho, ArrayList<beUbicacion> ordenOptimoUbics) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "UPDATE UBICACION_X_PALLET SET ID_ORDEN_DESPACHO = ?, ESTADOUBICACION = ?, ORDEN = ? WHERE ID_UBICACION = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idOrdenDespacho);
        ps.setInt(2, daoUbicacion.E_RESERVADO);
        for(int i=1; i<(ordenOptimoUbics.size());i++){
            ps.setInt(3, i);
            ps.setInt(4, ordenOptimoUbics.get(i).getId_ubicacion());
            ps.executeUpdate();
        }
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int quitarEstadoReservado(int idOrdenDespacho) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        String sql = "UPDATE UBICACION_X_PALLET SET ID_ORDEN_DESPACHO = NULL, ORDEN = NULL, ESTADOUBICACION = ? WHERE ID_ORDEN_DESPACHO = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, this.E_OCUPADO);
        ps.setInt(2, idOrdenDespacho);
        ps.executeUpdate();
        ps.close();
        conn.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public ArrayList<beUbicacion> dameTodasLasUbicaciones() throws Exception{
       ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
       ArrayList<Integer> estados = new ArrayList<Integer>();
       estados = getTipoEstadoInt();
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       String sql = "SELECT U.* FROM UBICACION U";
       conn = daoHelper.dameConexion();
       ps = conn.prepareStatement(sql);
       rs = ps.executeQuery();
       while (rs.next()){
           beCoordenada coordenada = new beCoordenada();
           beUbicacion ubicacion = new beUbicacion();

           coordenada.setPiso(rs.getInt(2));
           coordenada.setUbicacion(rs.getInt(3));
           coordenada.setxEnMapa(rs.getInt(4));
           coordenada.setyEnMapa(rs.getInt(5));
           ubicacion.setId_ubicacion(rs.getInt(1));
           ubicacion.setId_rack(rs.getInt(6));
           ubicacion.setCoordenadas(coordenada);
           ubicaciones.add(ubicacion);
       }
       rs.close();
       ps.close();
       conn.close();
       return ubicaciones;
    }

    public String dameEstado(int idUbicacion) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int cont = -1;
        String sql = "SELECT COUNT(*) AS CONTEO FROM UBICACION_X_PALLET WHERE ID_UBICACION = ? AND ESTADOUBICACION <> 33";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1,idUbicacion);
        rs = ps.executeQuery();
        rs.next();
        String estado = null;
        boolean desbloqueado = false;
        cont = rs.getInt(1);
        
        if (cont == 0){
           sql = "SELECT DESBLOQUEADO FROM UBICACION WHERE ID_UBICACION = ?";
           ps = conn.prepareStatement(sql);
           ps.setInt(1,idUbicacion);
           rs = ps.executeQuery();
           rs.next();
           if (rs.getBoolean(1))
            estado = "Disponible";
           else
            estado = "Bloqueado";
        }
        else {
           sql = "SELECT ESTADOUBICACION FROM UBICACION_X_PALLET WHERE ID_UBICACION = ?";
           ps = conn.prepareStatement(sql);
           ps.setInt(1,idUbicacion);
           rs = ps.executeQuery();
           rs.next();
           int id_estado = 0;
           id_estado = rs.getInt(1);
             if (id_estado == E_ROTADO)
                 estado = "Rotado";
             else
                 if(id_estado == E_RESERVADO)
                     estado ="Reservado";
                 else
                     if (id_estado == E_OCUPADO)
                         estado = "Ocupado";

        }

        rs.close();
        ps.close();
        conn.close();

        return estado;

    }

    public ArrayList<Point> getUbsInRackByXY(int pos_x, int pos_y) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select u.posicion_x, u.posicion_y from ubicacion u where id_rack= "
                + "(select id_rack from ubicacion where posicion_x=? and posicion_y=? and numero_piso=1)";
        

        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, pos_x);
        ps.setInt(2, pos_y);


        ArrayList<Point> arrUbs = new ArrayList<Point>();

        while (rs.next()){
           Point ubi = new Point();
           ubi.x=rs.getInt(1);
           ubi.y=rs.getInt(2); 
           arrUbs.add(ubi);
       }
       rs.close();
       ps.close();
       conn.close();
       return arrUbs;
    }

    public ArrayList<bePallet> dameUbicacionesOcupada(ArrayList<beUbicacion> ubicacionesOcupadas,int estado,String strFila,String strRack,String strPiso,String strUbi,ArrayList<String> estados) throws SQLException{
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;       
       int []contador = new int[5];
       int Fila = -1;
       int Rack = -1;
       int Piso = -1;
       int Ubi = -1;
       String sql = "SELECT UP.ID_UBICACION,U.NUMERO_PISO,U.NUMERO_UBICACION,R.NUMERO_FILA,R.NUMERO_RACK,UP.ID_PALLET,U.ID_RACK FROM UBICACION U,UBICACION_X_PALLET UP,RACK R WHERE UP.ID_UBICACION = U.ID_UBICACION AND U.ID_RACK = R.ID_RACK AND UP.ESTADOUBICACION = ?";
        contador[0] = 1;
        if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[1] = 1;
        }

        if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[2] = 1;
        }

        if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[3] = 1;
        }

         if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[4] = 1;
        }


        sql += " ORDER BY UP.ID_UBICACION ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        int j=0;
        for(int i=0; i<5; i++){
            if (contador[i]==1){
                j++;
                switch (i){
                    case 0:
                        if (estado == E_OCUPADO)
                         ps.setInt(j,beUbicacion.U_ACTIVO);
                        else
                         ps.setInt(j, E_RESERVADO);
                        break;

                    case 1:
                        ps.setInt(j,Fila);
                        break;

                    case 2:
                        ps.setInt(j,Rack);
                        break;

                    case 3:
                        ps.setInt(j,Piso);
                        break;

                    case 4:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }

        rs= ps.executeQuery();
        ArrayList<bePallet> pallets = new ArrayList<bePallet>();


        while (rs.next()){
            beCoordenada  c = new beCoordenada();
            blUbicacion bu = new blUbicacion();
            beUbicacion ubicacion = new beUbicacion();
            bePallet p  = new bePallet();
            c.setFila(rs.getInt(4));
            c.setPiso(rs.getInt(2));
            c.setRack(rs.getInt(5));
            c.setUbicacion(rs.getInt(3));
            ubicacion.setCoordenadas(c);
            ubicacion.setId_ubicacion(rs.getInt(1));
            ubicacion.setId_rack(rs.getInt(7));
            p.setId_Pallet(rs.getInt(6));
            pallets.add(p);
            ubicacionesOcupadas.add(ubicacion);
            if (estado == E_OCUPADO)
             estados.add(OCUPADO);
            else
             estados.add(RESERVADO);
        }
       rs.close();
       ps.close();
       conn.close();
       return pallets;



    }

    public ArrayList<beUbicacion> dameUbicacionesPosiblesXFiltros(int tipoProd,int tipoPallet,String strFila, String strRack,String strPiso,String strUbi) throws SQLException{
       Connection conn = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       int []contador = new int[4];
       int Fila = -1;
       int Rack = -1;
       int Piso = -1;
       int Ubi = -1;
       ArrayList<Integer> estados = new ArrayList<Integer> ();
       estados = getTipoEstadoInt();
       ArrayList<beUbicacion> ubiOcupadas = obtenerUbicacion(estados.get(0));
       ArrayList<beUbicacion> ubiReservadas = obtenerUbicacion(estados.get(4));
       ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
       ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();

         for(int i=0;i < ubiOcupadas.size();i++){
           ubiPallet.add(ubiOcupadas.get(i));
         }


         for(int i=0;i < ubiReservadas.size();i++){
           ubiPallet.add(ubiReservadas.get(i));
         }

         String sql = null;

         sql = "SELECT DISTINCT U.*,R.* FROM UBICACION U, RACK R WHERE U.DESBLOQUEADO = 't' AND U.TIPO_PALLET = ? AND R.ID_TIPO_PRODUCTO = ? AND R.ID_RACK = U.ID_RACK";



           for(int i=0;i < ubiPallet.size();i++){

               sql += " AND U.ID_UBICACION <> ?";

           }

          
         if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[0] = 1;
        }

        if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[1] = 1;
        }

        if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[2] = 1;
        }

         if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[3] = 1;
        }


        sql += " ORDER BY U.ID_UBICACION ";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1,tipoPallet);
        ps.setInt(2, tipoProd);

        for(int i=3;i <= ubiPallet.size()+2;i++){
                 ps.setInt(i,ubiPallet.get(i-3).getId_ubicacion());

        }


        int j=ubiPallet.size()+2;
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){

                    case 0:
                        ps.setInt(j,Fila);
                        break;

                    case 1:
                        ps.setInt(j,Rack);
                        break;

                    case 2:
                        ps.setInt(j,Piso);
                        break;

                    case 3:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }

        rs= ps.executeQuery();
        ArrayList<beUbicacion> ubiDisponibles = new ArrayList<beUbicacion>();


        while (rs.next()){
            beCoordenada coordenada = new beCoordenada();
            beUbicacion ubicacion = new beUbicacion();
            coordenada.setFila(rs.getInt(16));
            coordenada.setRack(rs.getInt(17));
            coordenada.setPiso(rs.getInt(2));
            coordenada.setUbicacion(rs.getInt(3));
            coordenada.setxEnMapa(rs.getInt(4));
            coordenada.setyEnMapa(rs.getInt(5));
            ubicacion.setCoordenadas(coordenada);
            ubicacion.setId_ubicacion(rs.getInt(1));
            ubicacion.setId_rack(rs.getInt(6));
            ubiDisponibles.add(ubicacion);

        }
       rs.close();
       ps.close();
       conn.close();
       return ubiDisponibles;
  }

   public ArrayList<beUbicacion> obtenerUbicacionDisponibleXFiltros(ArrayList<beUbicacion> ubicacionesOcupadas,ArrayList<beUbicacion> ubicacionesReservadas,String strFila,String strRack,String strPiso,String strUbi) throws SQLException{
         ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
         ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         int []contador = new int[4];
         int Fila = -1;
         int Rack = -1;
         int Piso = -1;
         int Ubi = -1;

         for(int i=0;i < ubicacionesOcupadas.size();i++){
           ubiPallet.add(ubicacionesOcupadas.get(i));
         }


         for(int i=0;i < ubicacionesReservadas.size();i++){

           ubiPallet.add(ubicacionesReservadas.get(i));
         }


          String sql = null;


           sql = "SELECT U.*,R.* FROM UBICACION U, RACK R WHERE U.DESBLOQUEADO = 't' AND U.ID_RACK = R.ID_RACK ";


           conn = daoHelper.dameConexion();



           for(int i=0;i < ubiPallet.size();i++){

               sql += " AND U.ID_UBICACION <> ?";

           }

           if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[0] = 1;
           }

           if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[1] = 1;
           }

           if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[2] = 1;
           }

           if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[3] = 1;
           }


        sql += " ORDER BY U.ID_UBICACION ";
        ps = conn.prepareStatement(sql);
             for(int i=1;i <= ubiPallet.size();i++){
                 ps.setInt(i,ubiPallet.get(i-1).getId_ubicacion());

             }
        int j=ubiPallet.size();
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){

                    case 0:
                        ps.setInt(j,Fila);
                        break;

                    case 1:
                        ps.setInt(j,Rack);
                        break;

                    case 2:
                        ps.setInt(j,Piso);
                        break;

                    case 3:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }



           rs = ps.executeQuery();

           while(rs.next()){;

             beUbicacion ubicacion = new beUbicacion(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(6));

             ubiDisp.add(ubicacion);
           }


         rs.close();
         ps.close();
         conn.close();

         return ubiDisp;

    }

   public ArrayList<beUbicacion> obtenerUbicacionBloqueadasXFiltros(ArrayList<beUbicacion> ubicacionesOcupadas,ArrayList<beUbicacion> ubicacionesReservadas,String strFila,String strRack,String strPiso,String strUbi) throws SQLException{
         ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
         ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();
         Connection conn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         int []contador = new int[4];
         int Fila = -1;
         int Rack = -1;
         int Piso = -1;
         int Ubi = -1;

         for(int i=0;i < ubicacionesOcupadas.size();i++){
            ubiPallet.add(ubicacionesOcupadas.get(i));
         }



         for(int i=0;i < ubicacionesReservadas.size();i++){

           ubiPallet.add(ubicacionesReservadas.get(i));
         }

          String sql = null;


           sql = "SELECT U.*,R.* FROM UBICACION U, RACK R WHERE DESBLOQUEADO = 'f' AND U.ID_RACK = R.ID_RACK ";


           conn = daoHelper.dameConexion();



           for(int i=0;i < ubiPallet.size();i++){

               sql += " AND U.ID_UBICACION <> ?";

           }

           if (!String.valueOf(strFila).isEmpty()){
            sql += " AND R.NUMERO_FILA = ? ";
            Fila = Integer.parseInt(strFila);
            contador[0] = 1;
           }

           if (!String.valueOf(strRack).isEmpty()){
             sql += " AND R.NUMERO_RACK = ? ";
             Rack = Integer.parseInt(strRack);
             contador[1] = 1;
           }

           if (!String.valueOf(strPiso).isEmpty()){
             sql += " AND U.NUMERO_PISO = ? ";
             Piso = Integer.parseInt(strPiso);
             contador[2] = 1;
           }

           if (!String.valueOf(strUbi).isEmpty()){
             sql += " AND U.NUMERO_UBICACION = ? ";
             Ubi = Integer.parseInt(strUbi);
             contador[3] = 1;
           }


        sql += " ORDER BY U.ID_UBICACION ";
        ps = conn.prepareStatement(sql);

             for(int i=1;i <= ubiPallet.size();i++){
                 ps.setInt(i,ubiPallet.get(i-1).getId_ubicacion());

             }
        int j=ubiPallet.size();
        for(int i=0; i<4; i++){
            if (contador[i]==1){
                j++;
                switch (i){

                    case 0:
                        ps.setInt(j,Fila);
                        break;

                    case 1:
                        ps.setInt(j,Rack);
                        break;

                    case 2:
                        ps.setInt(j,Piso);
                        break;

                    case 3:
                        ps.setInt(j,Ubi);
                        break;

                }
            }
        }
           rs = ps.executeQuery();
           while(rs.next()){;
             beUbicacion ubicacion = new beUbicacion(rs.getInt(1),rs.getInt(2),rs.getInt(3),rs.getInt(6));

             ubiDisp.add(ubicacion);
           }


         rs.close();
         ps.close();
         conn.close();

         return ubiDisp;

    }

    public ArrayList<beUbicacion> dameTodasLasUbicacionesDisponibles() throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<Integer> estados = new ArrayList<Integer> ();
        estados = getTipoEstadoInt();
        ArrayList<beUbicacion> ubiOcupadas = obtenerUbicacion(estados.get(0));
        ArrayList<beUbicacion> ubiReservadas = obtenerUbicacion(estados.get(4));
        ArrayList<beUbicacion> ubiPallet = new ArrayList<beUbicacion> ();
        ArrayList<beUbicacion> ubiDisp = new ArrayList<beUbicacion>();

             for(int i=0;i < ubiOcupadas.size();i++){
               ubiPallet.add(ubiOcupadas.get(i));
             }


             for(int i=0;i < ubiReservadas.size();i++){
               ubiPallet.add(ubiReservadas.get(i));
             }

             String sql = null;

             sql = "SELECT DISTINCT U.*,R.* FROM UBICACION U, RACK R WHERE U.DESBLOQUEADO = 't' AND R.ID_RACK = U.ID_RACK";



               for(int i=0;i < ubiPallet.size();i++){

                   sql += " AND U.ID_UBICACION <> ?";

               }

               conn = daoHelper.dameConexion();
               ps = conn.prepareStatement(sql);


                 for(int i=0;i < ubiPallet.size();i++){
                     ps.setInt(i+1,ubiPallet.get(i).getId_ubicacion());

               }



        rs=ps.executeQuery();

        while(rs.next()){
            beCoordenada coordenada = new beCoordenada();
            beUbicacion ubicacion = new beUbicacion();
            coordenada.setFila(rs.getInt(16));
            coordenada.setRack(rs.getInt(17));
            coordenada.setPiso(rs.getInt(2));
            coordenada.setUbicacion(rs.getInt(3));
            coordenada.setxEnMapa(rs.getInt(4));
            coordenada.setyEnMapa(rs.getInt(5));
            ubicacion.setId_ubicacion(rs.getInt(1));
            ubicacion.setId_rack(rs.getInt(6));
            ubicacion.setCoordenadas(coordenada);
            ubicacion.setTipo_pallet(rs.getInt(8));
            ubicacion.setDesbloqueado(rs.getBoolean(7));
            ubiDisp.add(ubicacion);
        }
        ps.close();
        conn.close();
        return ubiDisp;
    }

    public ArrayList<beUbicacion> getTodasUbicaciones() throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
        String sql = "SELECT U.*,R.* FROM UBICACION U, RACK R WHERE U.ID_RACK = R.ID_RACK";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        rs=ps.executeQuery();
        while (rs.next()){
            beUbicacion ubi = new beUbicacion();
            beCoordenada c = new beCoordenada();
            c.setFila(rs.getInt(16));
            c.setRack(rs.getInt(17));
            c.setUbicacion(rs.getInt(3));
            c.setPiso(rs.getInt(2));
            c.setxEnMapa(rs.getInt(4));
            c.setyEnMapa(rs.getInt(5));
            ubi.setCoordenadas(c);
            ubi.setId_ubicacion(rs.getInt(1));
            ubi.setDesbloqueado(rs.getBoolean(7));
            ubi.setTipo_pallet(rs.getInt(8));
            ubi.setId_rack(rs.getInt(6));
            ubicaciones.add(ubi);
        }
        rs.close();
        ps.close();
        conn.close();
        return ubicaciones;

    }

    public ArrayList<beUbicacion> getTodasUbicacionesBloqueadas() throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
        String sql = "SELECT U.*,R.* FROM UBICACION U, RACK R WHERE U.ID_RACK = R.ID_RACK AND U.DESBLOQUEADO = 'f'";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        rs=ps.executeQuery();
        while (rs.next()){
            beUbicacion ubi = new beUbicacion();
            beCoordenada c = new beCoordenada();
            c.setFila(rs.getInt(16));
            c.setRack(rs.getInt(17));
            c.setUbicacion(rs.getInt(3));
            c.setPiso(rs.getInt(2));
            c.setxEnMapa(rs.getInt(4));
            c.setyEnMapa(rs.getInt(5));
            ubi.setCoordenadas(c);
            ubi.setId_ubicacion(rs.getInt(1));
            ubi.setDesbloqueado(rs.getBoolean(7));
            ubi.setTipo_pallet(rs.getInt(8));
            ubi.setId_rack(rs.getInt(6));
            ubicaciones.add(ubi);
        }
        rs.close();
        ps.close();
        conn.close();
        return ubicaciones;

    }

    public alAlgMetaHeu ubicacionesXOrden(int idOrden) throws Exception{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<beUbicacion> ubicaciones = new ArrayList<beUbicacion>();
        ArrayList<beUbicacion> ubicacionesOrdenadas = new ArrayList<beUbicacion>();
        String sql = "SELECT U.*,R.*,UP.ID_PALLET,PR.NOMBRE FROM UBICACION U, RACK R,UBICACION_X_PALLET UP,PALLET P,PRODUCTO PR WHERE U.ID_RACK = R.ID_RACK AND UP.ID_UBICACION = U.ID_UBICACION AND UP.ID_PALLET = P.ID_PALLET AND P.ID_PRODUCTO = PR.ID_PRODUCTO AND UP.ID_ORDEN_DESPACHO = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idOrden);
        rs=ps.executeQuery();
        while (rs.next()){
            beUbicacion ubi = new beUbicacion();
            beCoordenada c = new beCoordenada();
            c.setFila(rs.getInt(16));
            c.setRack(rs.getInt(17));
            c.setUbicacion(rs.getInt(3));
            c.setPiso(rs.getInt(2));
            c.setxEnMapa(rs.getInt(4));
            c.setyEnMapa(rs.getInt(5));
            ubi.setCoordenadas(c);
            ubi.setId_ubicacion(rs.getInt(1));
            ubi.setIdPallet(rs.getInt(19));
            ubi.setNombProducto(rs.getString(20));
            ubi.setDesbloqueado(rs.getBoolean(7));
            ubi.setTipo_pallet(rs.getInt(8));
            ubi.setId_rack(rs.getInt(6));
            ubicaciones.add(ubi);
        }

        

        blogic.blHelper blh = new blogic.blHelper();
        bentity.beAlmacen alm = blh.obtenerDatosAlmacen();
        ArrayList<bentity.beEntrada> entradas = (new blogic.blAlmacen()).buscarObjsEntrada();
        int numCol = blh.calcularNumeroColumnas(alm.getRacksXFila(), alm.getUbsxrack());
        int numFil = blh.calcularNumeroFilas(alm.getFilas());
        int posEntX = entradas.get(0).getPos_x();
        int posEntY = entradas.get(0).getPos_y();

        if ((posEntX == numCol)&&(posEntY != numFil))
          --posEntX;
        if ((posEntX != numCol)&&(posEntY == numFil))
          --posEntY;
        if ((posEntX == 0)&&(posEntY != 0))
          ++posEntX;
        if ((posEntX != 0)&&(posEntY ==0))
          ++posEntY;

        beUbicacion ent = new beUbicacion();
        ent.setIdUbicacion(0);
        beCoordenada c = new beCoordenada();
        c.setxEnMapa(posEntX);
        c.setyEnMapa(posEntY);
        ent.setCoordenadas(c);
        ubicaciones.add(0,ent);

       alAlgMetaHeu alg = new alAlgMetaHeu();
       this.entrada = entradas.get(0);
        try {
            alg.CalcularRutaOptima(ubicaciones);
            ubicacionesOrdenadas = alg.getOrdenOptimoUbics();
            actualizarOrden(ubicacionesOrdenadas);
            ArrayList<bePallet> pallets = (new blOrdenDespacho()).obtenerTodosLosPallets(ubicacionesOrdenadas);

            for(int i=0; i<ubicacionesOrdenadas.size(); i++){
             for(int j=0; j<pallets.size(); j++){
                if (pallets.get(j).getUbicacion().getId_ubicacion() == ubicacionesOrdenadas.get(i).getId_ubicacion()){
                    ubicacionesOrdenadas.get(i).setIdPallet(pallets.get(j).getId_Pallet());
                    ubicacionesOrdenadas.get(i).setNombProducto(pallets.get(j).getDescProducto());
                    break;
                }
            }
        }
        } catch (Exception ex) {
            Logger.getLogger(daoUbicacion.class.getName()).log(Level.SEVERE, null, ex);
        }

      rs.close();
      ps.close();
      conn.close();
      return alg;
       
    }

    public void actualizarOrden(ArrayList<beUbicacion> ubicaciones) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        conn = daoHelper.dameConexion();
        for (int i=0; i < ubicaciones.size();i++){
            String sql = "UPDATE UBICACION_X_PALLET SET ORDEN = ? WHERE ID_UBICACION = ?";
            ps = conn.prepareStatement(sql);
            ps.setInt(1,i+1);
            ps.setInt(2,ubicaciones.get(i).getId_ubicacion());
            ps.executeUpdate();
        }
        ps.close();
        conn.close();

    }
    
    public beUbicacion obtenerUbicacionXCajas(int numCajas, int idProducto) throws SQLException{
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "SELECT U.*,R.* FROM UBICACION U, RACK R, UBICACION_X_PALLET UP, PALLET P WHERE U.ID_RACK = R.ID_RACK AND U.ID_UBICACION = UP.ID_UBICACION AND P.ID_PALLET = UP.ID_PALLET AND P.CANTIDAD_CAJAS = ? AND P.ID_PRODUCTO = ? AND UP.ESTADOUBICACION = ?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, numCajas);
        ps.setInt(2,idProducto);
        ps.setInt(3,E_OCUPADO);
        rs=ps.executeQuery();
        beUbicacion ubi = new beUbicacion();
        if (rs.next()){
          beCoordenada c = new beCoordenada();
          c.setFila(rs.getInt(16));
          c.setRack(rs.getInt(17));
          c.setUbicacion(rs.getInt(3));
          c.setPiso(rs.getInt(2));
          c.setxEnMapa(rs.getInt(4));
          c.setyEnMapa(rs.getInt(5));
          ubi.setCoordenadas(c);
          ubi.setId_ubicacion(rs.getInt(1));
          ubi.setDesbloqueado(rs.getBoolean(7));
          ubi.setTipo_pallet(rs.getInt(8));
          ubi.setId_rack(rs.getInt(6));
          rs.close();
          ps.close();
          conn.close();
          return ubi;
        }
        else
          return null;
               
       
    }

    public ArrayList<beUbicacion> dameUbicacionesDeUnRack(int idRack) throws Exception{
        ArrayList<beUbicacion> arrUbics= new ArrayList<beUbicacion>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select u.* from ubicacion u where u.id_rack=?";
        conn = daoHelper.dameConexion();
        ps = conn.prepareStatement(sql);
        ps.setInt(1, idRack);
        rs=ps.executeQuery();

        while (rs.next()){
          beUbicacion ubi = new beUbicacion();
          beCoordenada c = new beCoordenada();
          c.setFila(rs.getInt(16));
          c.setRack(rs.getInt(17));
          c.setUbicacion(rs.getInt(3));
          c.setPiso(rs.getInt(2));
          c.setxEnMapa(rs.getInt(4));
          c.setyEnMapa(rs.getInt(5));
          ubi.setCoordenadas(c);
          ubi.setId_ubicacion(rs.getInt(1));
          ubi.setDesbloqueado(rs.getBoolean(7));
          ubi.setTipo_pallet(rs.getInt(8));
          ubi.setId_rack(rs.getInt(6));

          arrUbics.add(ubi);

        }

        if(arrUbics.size()==0) return null;

        rs.close();
        ps.close();
        conn.close();

        return arrUbics;
    }



}
